/*
 * Copyright (c) 2021. Moses All Right Reserved
 */

package com.moses.design_patterns.proxy.static_proxy.abstract_proxy;

/**
 * @author Moses
 * @email shenhuohui@gmail.com
 * @date 2021/4/10 17:56
 */
public class Client {
    public static void main(String[] args) {
        //1. 指定代理类代理谁
        AbstractSubject subject = new RealSubject();
        // 传递 subject，告诉代理要代理谁
        Proxy proxy = new Proxy(subject);
        // 代理执行
        proxy.method();

        System.out.println("===============");

        // 2. 只知道代理类，由代理类来决定代理谁
        SubjectProxy proxy1 = new SubjectProxy();
        proxy1.method();

        System.out.println("=================");
        // 3. 只知道谁，由谁来决定使用哪个代理，要先获得代理，才可继续
        ProxiedAbstractSubject subject2 = new RealSubject2();
        // 不能直接 subject2.method()，必须先获得代理，再通过代理执行
        ProxiedAbstractSubject proxy2 = subject2.getProxy();
        proxy2.method();

        // 4. 指定谁用哪个代理（不可行）

        // 可以把抽象类换成接口
    }
}
